/* 立即执行模式，封装一个模块*/
/* 对外输出一个类
    定义一个类：3种
    通过定义一个对象来定义一个类
        var objA={
            attrA:attra,
            attB：attB
        }
        //通过合并克隆的方法来新建一个新的对象
        $.extend({},objA);
        var objB=new Object();
     通过定义一个构造函数来定义一个类
        var classC=function(){

        }
        //通过new方法来新建一个新的对象
        var objC=new ClassC()
        //1 在堆中创建一个空间
        //2 执行构造函数(this指针指向刚刚在堆中创建的新空间,我们理解为新创建的空间命名为一个匿名的变量名(内部使用,例如obj，而构造函数命名为constructor),obj.constructor())
        //3 constructor.prototype赋值给obj.__proto__
        //4 返回这个空间（在这个例子中，这个空间就命名为objC）
    闭包
        父函数空间,不可以访问子函数的空间
        但是子函数空间,可以访问父函数的空间
    window
        window在浏览器使用javascript,window就是全局空间
        document(window.document)
    
*/
//(function(){})()
//!function{}()
//+function{}()
//-function{}()
!(function() {
  var queue = function() {
    this.dataStore = [];
    this.top = 0; //永远指向第一个
    this.bottom = 0; //永远指向下一个要添加的元素的位置
  };
  queue.prototype.clear = function(element, after) {
    delete this.dataStore;
    this.dataStore = [];
    this.top = 0;
    this.bottom = 0;
  };
  queue.prototype.unshift = function(element) {
    //在队列尾增加一个元素
    this.dataStore[bottom] = elment;
    this.bottom++;
  };
  queue.prototype.shift = function() {
    //在队列头删除一个元素
    if (this.top < this.bottom) {
      delete this.dataStore[top];
      this.top++;
    }
  };
  queue.prototype.length = function() {
      return this.bottom-this.top;
  };
  window.fi.queue = queue;
})(window.fi);
